package com.demarc.pesquisas.negocio.entidade.pesquisa;

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.hibernate.annotations.Type;
import org.hibernate.validator.constraints.NotBlank;
import org.joda.time.LocalDate;

import com.demarc.pesquisas.infraestrutura.hibernate.type.HibernateTypes;
import com.demarc.pesquisas.infraestrutura.persistencia.ObjetoPersistenteVersionado;

@Entity
@Table(name = "pes_pesquisa")
@AttributeOverrides(value = {
		@AttributeOverride(name = "ultimaAtualizacao", column = @Column(name = "pes_ultima_atualizacao")),
		@AttributeOverride(name = "usuarioAtualizacao", column = @Column(name = "pes_usuario_atualizacao")) })
public class Pesquisa extends ObjetoPersistenteVersionado<Long> {

	public static final String ID = "pes_id";

	private Long id;
	private String nome;
	private LocalDate dataInicio;
	private LocalDate dataFim;

	@Id
	@Column(name = ID)
	@GeneratedValue(strategy = GenerationType.AUTO)
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@Column(name = "pes_nome", nullable = false)
	@NotBlank
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	@NotNull
	@Type(type = HibernateTypes.JODA_LOCAL_DATE)
	@Column(name = "pes_data_inicio", nullable = false)
	public LocalDate getDataInicio() {
		return dataInicio;
	}

	public void setDataInicio(LocalDate dataInicio) {
		this.dataInicio = dataInicio;
	}

	@Type(type = HibernateTypes.JODA_LOCAL_DATE)
	@Column(name = "pes_data_fim")
	public LocalDate getDataFim() {
		return dataFim;
	}

	public void setDataFim(LocalDate dataFim) {
		this.dataFim = dataFim;
	}

	@Override
	public int hashCode() {
		return new HashCodeBuilder().append(this.nome).toHashCode();
	}

	@Override
	public boolean equals(Object obj) {
		boolean isEquals = false;

		if (obj == this) {
			isEquals = true;
		} else if (obj instanceof Pesquisa) {
			Pesquisa pesquisa = (Pesquisa) obj;
			isEquals = new EqualsBuilder()
					.append(this.nome, pesquisa.getNome()).isEquals();
		}
		return isEquals;
	}
}
